package pe.edu.unmsm.ocaa.workspace.presentacion.controller.procesos;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.UsuarioDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.VWUsuarioDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.servicio.GrupoService;
import pe.edu.unmsm.ocaa.workspace.negocio.servicio.UsuarioService;

@Controller
@Scope("view")
public class UsuarioController {

	/*****************ATRIBUTOS**************/
	private UsuarioDTO usuario;
	private VWUsuarioDTO usuarioSeleccionado;
	private List<VWUsuarioDTO> listUsuarios;
	private boolean uiregUsuario;
	private boolean uilistUsuario;
	private Map<String, String> grupos;
	private List<String> gruposSeleccionados;
	
	@Resource
	UsuarioService usuarioService;
	@Resource
	GrupoService grupoService;
	
	/*****************INICIALIZACION**************/
	public UsuarioController() {
		setUsuario(new UsuarioDTO());
		getUsuario().setGrupos(new ArrayList<String>());
	}	
	@PostConstruct
	private void init(){
		setListUsuarios(usuarioService.listarUsuarios());
		HttpSession session=(HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true);
		setUsuario((UsuarioDTO)session.getAttribute("usuarioEditar"));
		setGrupos(grupoService.listarGruposMap());
		if(getUsuario()==null)
			setUsuario(new UsuarioDTO());
	}
	
	/*****************NAVEGACION**************/
	public void guardarUsuario(ActionEvent ev){
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			if (usuarioService.validarCamposUsuario(getUsuario())) {
				usuarioService.guardarUsuario(getUsuario());
				setUsuario(new UsuarioDTO());
				context.addMessage(null, new FacesMessage("Exito", "El usuario se guardo correctamente"));	
			}else
				context.addMessage(null, new FacesMessage("Aviso", "Falta llenar los campos obligatorios (*)"));
			
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Error", "No se pudo guardar el usuario"));
		}  
	}
	
	public void limpiarUsuario(ActionEvent ev){
		setUsuario(new UsuarioDTO());
	}
	
	public String editarUsuario(){
		HttpSession session=(HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true);
		session.setAttribute("usuarioEditar", usuarioService.obtenerUsuario(usuarioSeleccionado.getIdUsuario()));
		return "regUsuario";
	}
	
	public void activarBloquearUsuario(ActionEvent ev){
		FacesContext context = FacesContext.getCurrentInstance();
		setUsuario(usuarioService.obtenerUsuario(usuarioSeleccionado.getIdUsuario()));
		usuarioService.activarBloquearUsuario(getUsuario());
		setListUsuarios(usuarioService.listarUsuariosxIdArchivo(null));
		context.addMessage(null, new FacesMessage("Exito", "El usuario se activo/bloqueo correctamente"));
	}
	
	public void eliminarUsuario(ActionEvent ev){
		FacesContext context = FacesContext.getCurrentInstance();
		setUsuario(usuarioService.obtenerUsuario(usuarioSeleccionado.getIdUsuario()));
		usuarioService.eliminarUsuario(getUsuario().getIdUsuario());
		setListUsuarios(usuarioService.listarUsuariosxIdArchivo(null));
		context.addMessage(null, new FacesMessage("Exito", "El usuario se elimino correctamente"));		
	}
	
	/*****************GETTERS AND SETTERS**************/
	public UsuarioDTO getUsuario() {
		return usuario;
	}
	public void setUsuario(UsuarioDTO usuario) {
		this.usuario = usuario;
	}
	public List<VWUsuarioDTO> getListUsuarios() {
		return listUsuarios;
	}
	public void setListUsuarios(List<VWUsuarioDTO> listUsuarios) {
		this.listUsuarios = listUsuarios;
	}

	public VWUsuarioDTO getUsuarioSeleccionado() {
		return usuarioSeleccionado;
	}

	public void setUsuarioSeleccionado(VWUsuarioDTO usuarioSeleccionado) {
		this.usuarioSeleccionado = usuarioSeleccionado;
	}
	public boolean isUilistUsuario() {
		return uilistUsuario;
	}
	public void setUilistUsuario(boolean uilistUsuario) {
		this.uilistUsuario = uilistUsuario;
	}
	public boolean isUiregUsuario() {
		return uiregUsuario;
	}
	public void setUiregUsuario(boolean uiregUsuario) {
		this.uiregUsuario = uiregUsuario;
	}
	public Map<String, String> getGrupos() {
		return grupos;
	}
	public void setGrupos(Map<String, String> grupos) {
		this.grupos = grupos;
	}
	public List<String> getGruposSeleccionados() {
		return gruposSeleccionados;
	}
	public void setGruposSeleccionados(List<String> gruposSeleccionados) {
		this.gruposSeleccionados = gruposSeleccionados;
	}
}
